package ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.InfraccionesBase;

import org.uqbar.commons.utils.ApplicationContext;
import org.uqbar.commons.utils.ApplicationContextConfiguration;
import org.uqbar.commons.utils.MemoryStorage;
import org.uqbar.commons.utils.Storage;

import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Captura;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Image;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.TipoInfraccion;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Zona;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Evasor;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.InfractorFrecuente;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Inhabilitado;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.externos.VerificadorDePagos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorCapturas;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorCategorias;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorVehiculos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.MailSender;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.ReconocedorDePatentesMock;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.SMSSender;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.VerificadorPagos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.notificaciones.NotificacionMail;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.notificaciones.NotificacionSMS;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.vehiculos.Vehiculo;

public class InfraccionesBase implements ApplicationContextConfiguration {

	private TipoInfraccion cruzarEnRojo;
	private TipoInfraccion sinCinturon;
	private TipoInfraccion bebeAdelante;
	private Zona saavedra;
	private Zona villaUrquiza;
	private Zona almagro;
	private Vehiculo fiat;
	private Vehiculo ford;
	private Vehiculo patenteNoSeVe;
	private Image imgCruzarEnRojo;
	private Image imgSinCinturon;
	private Image imgBebeAdelante;
	
	private AdministradorCategorias administradorCategorias;
	/*private AdministradorVehiculos administradorVehiculos;
	private AdministradorCapturas administradorCapturas;
	private VerificadorPagos verificadorPagos;
	*/
	private ReconocedorDePatentesMock reconocedorDePatentes;

	
	@Override
	public void configure(ApplicationContext arg0) {
		
		installSingletons();
	
		// Infracciones
		cruzarEnRojo = this.makePersistent(TipoInfraccion.class, createCruzarEnRojo());
		sinCinturon = this.makePersistent(TipoInfraccion.class, createSinCinturon());
		bebeAdelante = this.makePersistent(TipoInfraccion.class, createBebeAdelante());

		// Zonas
		saavedra = this.makePersistent(Zona.class, createSaavedra());
		villaUrquiza = this.makePersistent(Zona.class, createVillaUrquiza());
		almagro= this.makePersistent(Zona.class, createAlmagro());
		
		// Imagenes
		imgCruzarEnRojo = this.makePersistent(Image.class, createImgCruzarEnRojo());
		imgSinCinturon = this.makePersistent(Image.class, createImgSinCinturon());
		imgBebeAdelante	= this.makePersistent(Image.class, createImgBebeAdelante());
		
		// Vehiculos
		
		fiat = this.makePersistent(Vehiculo.class, createFiat());
		ford = this.makePersistent(Vehiculo.class, createFord());
		patenteNoSeVe = this.makePersistent(Vehiculo.class, createPatenteNoSeVe());
		
		// Administradores
		administradorCategorias = ApplicationContext.getInstance().getSingleton(AdministradorCategorias.class);
		
		NotificacionMail notificacionEvasor = new NotificacionMail(new MailSender());
		notificacionEvasor.setFrom("sistema-fotomultas@tadp.com.ar");
		notificacionEvasor.setDireccion("capturanus@afip.gob.ar");
		
		NotificacionSMS notificacionInhabilitado = new NotificacionSMS(new SMSSender());
		Evasor evasor = new Evasor();
		evasor.setNotificacion(notificacionEvasor);
		Inhabilitado inhabilitado = new Inhabilitado();
		inhabilitado.setNotificacion(notificacionInhabilitado);
		administradorCategorias.addCategoria(evasor);
		administradorCategorias.addCategoria(inhabilitado);
		administradorCategorias.addCategoria(new InfractorFrecuente());
		
		/*administradorVehiculos= ApplicationContext.getInstance().getSingleton(AdministradorVehiculos.class);
		administradorCapturas = ApplicationContext.getInstance().getSingleton(AdministradorCapturas.class);
		verificadorPagos = ApplicationContext.getInstance().getSingleton(VerificadorDePagos.class);
		*/
		// Reconocedor de patentes
		reconocedorDePatentes = ApplicationContext.getInstance().getSingleton(ReconocedorDePatentesMock.class);
	}

	// ** Accessors para infracciones
	// ********************************************************
	
	public TipoInfraccion getCruzarEnRojo() {
		return cruzarEnRojo;
	}

	public TipoInfraccion getSinCinturon() {
		return sinCinturon;
	}

	public TipoInfraccion getBebeAdelante() {
		return bebeAdelante;
	}
	
	// ** Accessors para zonas
	// ********************************************************
	
	public Zona getSaavedra(){
		return saavedra;
	}
	
	public Zona getVillaUrquiza(){
		return villaUrquiza;
	}
	
	public Zona getAlmagro(){
		return almagro;
	}

	// ** Accessors para images
	// ********************************************************
	
	public Image getImgCruzarEnRojo(){
		return imgCruzarEnRojo;
	}
	
	public Image getImgSinCinturon(){
		return imgSinCinturon;
	}
	
	public Image getImgBebeAdelante(){
		return imgBebeAdelante;
	}

	// ** Accessors para images
	// ********************************************************

	public Vehiculo getFiat(){
		return fiat;
	}
	
	public Vehiculo getFord(){
		return ford;
	}
	
	public Vehiculo getPatenteNoSeVe(){
		return patenteNoSeVe;
	}
	
	// ** Reconocedor de patentes mock
	// ********************************************************
	
	public ReconocedorDePatentesMock getReconocedorDePatentes(){
		return reconocedorDePatentes;
	}
	
	// ********************************************************
	// ** Infracciones
	// ********************************************************

	/**
	 * Infraccion que envia un mail
	 * evasor
	 */
	
	private TipoInfraccion createCruzarEnRojo() {
		
		TipoInfraccion infraccion = new TipoInfraccion("CruzarEnRojo", 10, 1500);
		NotificacionMail notiMail = new NotificacionMail(new MailSender());
		notiMail.setFrom("sistema-fotomultas@tadp.com.ar");
		notiMail.setDireccion("teponeslagorra@policiafederal.gob.ar");
		infraccion.addNotificacion(notiMail);
		
		return infraccion;
	}
	 
	/**
	 * Infraccion que envia un SMS
	 * infractor frecuente (agregar 5 de estos)
	 */
	
	private TipoInfraccion createSinCinturon () {
		
		TipoInfraccion infraccion = new TipoInfraccion("SinCinturon", 1, 1);
		NotificacionSMS notiSms = new NotificacionSMS(new SMSSender());
		infraccion.addNotificacion(notiSms);

		return infraccion;
	}
	
	/**
	 * Infraccion Inhabilitado
	 */
	
	private TipoInfraccion createBebeAdelante() {
		TipoInfraccion infraccion = new TipoInfraccion("BebeAdelante", 200, 150);
		NotificacionMail notiMail = new NotificacionMail(new MailSender());
		notiMail.setFrom("sistema-fotomultas@tadp.com.ar");
		notiMail.setDireccion("teponeslagorra@policiafederal.gob.ar");
		infraccion.addNotificacion(notiMail);

		return infraccion;
	}
	

	// ********************************************************
	// ** Zonas
	// ********************************************************

	private Zona createSaavedra(){
		Zona zona = new Zona("Saavedra","1553647584");
		
		return zona;
	}
	
	private Zona createVillaUrquiza(){
		Zona zona = new Zona("Villa Urquiza","1549857409");
		
		return zona;		
	}
	
	private Zona createAlmagro(){
		Zona zona = new Zona("Almagro","1556573210");
		
		return zona;		
	}
	
	// ********************************************************
	// ** Images
	// ********************************************************
	
	private Image createImgCruzarEnRojo(){
		Image image = new Image("Cruzo en Rojo.jpj");
		
		return image;
	}
	
	private Image createImgSinCinturon(){
		Image image = new Image("No usaba cinturon.jpg");
		
		return image;
	}
	
	private Image createImgBebeAdelante(){
		Image image = new Image("Bebe adelante.jpg");
		
		return image;
	}

	// ********************************************************
	// ** Vehiculos
	// ********************************************************
	
	private Vehiculo createFiat(){
		Vehiculo vehiculo = new Vehiculo("ABC 123");
	
		return vehiculo;
	}
	
	private Vehiculo createFord(){
		Vehiculo vehiculo = new Vehiculo("XYZ 987");
		
		return vehiculo;		
	} 

	private Vehiculo createPatenteNoSeVe(){
		Vehiculo vehiculo = new Vehiculo("ZZZ 666");
		
		return vehiculo;		
	} 

	// ********************************************************
	// ** Internal
	// ********************************************************

	private <T> T makePersistent(Class<? super T> type, T object) {
		ApplicationContext.getInstance().getHome(type).add(object);
		return object;
	}

	private void installSingletons() {
		ApplicationContext.getInstance().configureSingleton(Storage.class, new MemoryStorage());
		ApplicationContext.getInstance().configureHome(Captura.class);
		ApplicationContext.getInstance().configureHome(TipoInfraccion.class);
		ApplicationContext.getInstance().configureHome(Vehiculo.class);
		ApplicationContext.getInstance().configureHome(Image.class);
		ApplicationContext.getInstance().configureHome(Zona.class);				
		
		ApplicationContext.getInstance().configureSingleton(VerificadorDePagos.class, new VerificadorPagos());
		ApplicationContext.getInstance().configureSingleton(AdministradorCategorias.class, new AdministradorCategorias());
		ApplicationContext.getInstance().configureSingleton(AdministradorVehiculos.class, new AdministradorVehiculos());
		ApplicationContext.getInstance().configureSingleton(AdministradorCapturas.class, new AdministradorCapturas());
		ApplicationContext.getInstance().configureSingleton(ReconocedorDePatentesMock.class, new ReconocedorDePatentesMock());
	}	
}
